function New(fn, ...arg) {
  const result = {};
  // 该对象的__proto__属性指向该构造函数的原型
  if (fn.prototype !== null) {
    Object.setPrototypeOf(result, fn.prototype);
  }
  // 将执行上下文(this)绑定到新创建的对象中
  const returnResult = fn.apply(result, arg);
  // 如果构造函数有返回值，那么这个返回值将取代第一步中新创建的对象。否则返回该对象
  if ((typeof returnResult === 'object' || typeof returnResult === 'function') && returnResult !== null) {
    return returnResult;
  }
  return result;
}